import fs from "fs";
import http from "http";
import path from "path";
import { URL } from "url"; // 引入URL模块处理地址解析
import { serverApi } from "./config";

/**
 * 上传文件到指定接口
 * @param uploadUrl 上传接口地址
 * @param filePath 本地文件路径
 * @returns Promise<string> 接口返回的原始响应数据
 */
function uploadFile(uploadUrl: string, filePath: string): Promise<string> {
  return new Promise((resolve, reject) => {
    // 生成唯一分隔符
    const boundary = `----NodeJsMultipartBoundary${Date.now()}`;

    // 读取本地文件
    fs.readFile(filePath, (err, fileData) => {
      if (err) {
        reject(new Error(`读取文件失败: ${err.message}`));
        return;
      }

      try {
        // 解析URL
        const urlObj = new URL(uploadUrl);

        // 配置请求参数
        const options: http.RequestOptions = {
          hostname: urlObj.hostname,
          port: urlObj.port ? Number(urlObj.port) : 80,
          path: urlObj.pathname + urlObj.search, // 包含查询参数
          method: "POST",
          headers: {
            "Content-Type": `multipart/form-data; boundary=${boundary}`,
            Connection: "close",
          },
        };

        // 创建请求
        const req = http.request(options, (res) => {
          let responseData = "";

          // 接收响应数据
          res.on("data", (chunk) => {
            responseData += chunk.toString(); // 转换为字符串拼接
          });

          // 响应结束
          res.on("end", () => {
            resolve(responseData); // 返回原始响应数据
          });
        });

        // 处理请求错误
        req.on("error", (e) => {
          reject(new Error(`请求失败: ${e.message}`));
        });

        // 构建multipart/form-data请求体
        const fileName = path.basename(filePath);
        // 注意：二进制数据需要单独处理，不能直接用join拼接（会破坏二进制格式）
        const formParts: (string | Buffer)[] = [
          `--${boundary}\r\n`,
          `Content-Disposition: form-data; name="file"; filename="${fileName}"\r\n`,
          `Content-Type: image/svg+xml\r\n`, // SVG的MIME类型
          `\r\n`, // 空行分隔头和数据
          fileData, // 二进制文件数据
          `\r\n--${boundary}--\r\n`, // 结束分隔符
        ];

        // 依次写入请求体（避免二进制数据被字符串处理破坏）
        formParts.forEach((part) => {
          req.write(part);
        });

        // 结束请求
        req.end();
      } catch (error) {
        reject(new Error(`处理请求时出错: ${(error as Error).message}`));
      }
    });
  });
}

// 使用示例
export async function testUpload() {
  try {
    const uploadUrl = `${serverApi}/gruul-mall-carrier-pigeon/oss-api/upload`;
    const filePath = path.join(__dirname, "./yyzz.jpg");
    const responseData = await uploadFile(uploadUrl, filePath);
    console.log("接口原始响应数据:", responseData);
    // 如需解析为JSON，可在此处处理
    const result = JSON.parse(responseData);
    console.log("解析后的结果:", result);
    return result.data as string;
  } catch (error) {
    console.error("上传失败:", (error as Error).message);
  }
}
